AWS Lambdaのevent sourceが削除出来なくなった時の対処法
こんにちは、せーのです。昨日に引き続きlambdaでちょっと困ったケースをご紹介します。
ちょっとした出来心
昨日の記事のケースを検証している時に、テスト用にS3バケットを作り、そのS3バケットをlambdaのevent sourceに追加しました。
色々と検証し、ひと通り終わったので何も考えずに要らなくなったS3バケットを削除しました。
ふとLambdaのコンソールを見ると削除したS3バケットをトリガーとするイベントソースが残っていました。
自動で消えてくれるわけではないのね、とこのイベントソースを削除しようとすると
なんとエラーが。そう、イベントソースを削除する前にバケットを削除してしまうとイベントソースが残ってしまうんですね。このイベントソースを消すにはちょっとしたコツがいるんです。
2つの解決法
同名のバケットを作る
1つ目は簡単な方法です。消したバケットと全く同じ名前のバケットをもう一回作って、イベントソース -> バケットの順で削除すれば消えてくれます。 ただし、同名のバケットを再び立ち上げるには削除してから1時間程待つ必要がありますのでご注意下さい。
AWS CLIから消す
2つ目の方法はAWS CLIからコマンドを叩いて消す方法です。AWS CLIでイベントソースを消すには[remove-permission]というコマンドを使います。
remove-permission
パラメータ
- --function-name : 対象となるLambda function名(ARNを記述)
- --statement-id : 消したいイベントソースのSid
ここで「イベントソースのSid」が必要になります。イベントソースのSidは[get-policy]というコマンドで確認することが出来ます。
get-policy
パラメータ
- --function-name : 対象となるLambda function名(ARNを記述)
ではやってみましょう。まずは[get-policy]コマンドでSidを確認します。リージョンを間違えないように注意してくださいね。
seinotsuyoshi$ aws lambda get-policy \ --function-name arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest \ --region us-east-1 { "Policy": "{\"Statement\":[{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"887464593869\"},\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::cm-lambda-test\"}},\"Resource\":\"arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest\",\"Action\":\"lambda:InvokeFunction\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Sid\":\"s3_cm-lambda-test\",\"Effect\":\"Allow\"},{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"887464593869\"},\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::chao2suke-lambda-eventsource\"}},\"Resource\":\"arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest\",\"Action\":\"lambda:InvokeFunction\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Sid\":\"Created_by_S3_Console_on_2015-04-15_02-13-16\",\"Effect\":\"Allow\"}],\"Id\":\"default\",\"Version\":\"2012-10-17\"}" } seinotsuyoshi$
なんかごちゃごちゃしてわかりにくいですが[Sid]と書かれている部分がStatement-idです。つまり
"Sid\":\"s3_cm-lambda-test\"
と
"Sid\":\"Created_by_S3_Console_on_2015-04-15_02-13-16\"
これですね。今回消す対象は2行目なので[Created_by_S3_Console_on_2015-04-15_02-13-16]ということになります。では消してみましょう。
seinotsuyoshi$ aws lambda remove-permission \ --function-name arn:aws:lambda:us-east-1:887464593869:function:cmS3PutMetadataTest \ --statement-id Created_by_S3_Console_on_2015-04-15_02-13-16 \ --region us-east-1 seinotsuyoshi$
思ったよりあっさり通りました。ではコンソール画面を見てみましょう。
見事消えてくれました。
まとめ
いかがでしたでしょうか。こちらもひらめかないと気づかない系です。ぜひ頭の片隅に入れておきましょう。